home *** CD-ROM | disk | FTP | other *** search
/ Just Call Me Internet / Just Call Me Internet.iso / prog / atari / c / stut_src / lect_msg.c < prev    next >
Text File  |  1996-05-27  |  19KB  |  748 lines

  1. /*
  2.  * lect_msg.c
  3.  *
  4.  * Purpose:
  5.  * -------- 
  6.  * lecture des messages d'une rubrique:
  7.  *
  8.  * History:
  9.  * --------
  10.  * 18.12.94: fplanque: Created
  11.  */
  12.  
  13.  
  14.      #include "!OPTIONS.H"                /* Options de compilation */         
  15.     #define    THIS_FILE    "LECT_MSG.C v1.00 - 02.95"
  16.           
  17.  
  18. /*
  19.  * System headers:
  20.  */
  21.     #include    <stdio.h>                    /* header standard */
  22.     #include <string.h>                    /* header tt de chaines */
  23.     #include    <stdlib.h>                    /* Pour malloc etc.. */
  24.    
  25.  
  26. /*
  27.  * Custom headers:
  28.  */
  29.     #include    "ARB_OUT.H"
  30.     #include    "DEF_ARBO.H"
  31.  
  32.     #include "SPEC_PU.H"
  33.  
  34.     #include "DATPG_PU.H"
  35.     #include "DBSYS_PU.H"
  36.     #include    "DEBUG_PU.H"    
  37.     #include    "SERV_PU.H"
  38.     #include    "LINE0_PU.H"
  39.     #include    "DBINT_PU.H"
  40.     #include    "IOFLD_PU.H"
  41.     #include "LECTM_PU.H"
  42.     #include "GENRC_PU.H"
  43.     #include "TERM_PU.H"
  44.     #include "TEXT_PU.H"
  45.     #include "SERCOMPU.H"
  46.  
  47. /*
  48.  * Private methods:
  49.  */
  50.     static    BOOL    LectMsg_CanRead(                        /* Out: TRUE_1 if allowed */
  51.                             VOIE                *    pVoie_curr,    /* In:  Voie concern‚e */
  52.                             COMPACT_RECORD    *    pCompRec    );    /* In:  Message concern‚ */        
  53.     static    BOOL    LectMsg_MoveToNextMsg(
  54.                             VOIE *    pVoie_curr );
  55.     static    BOOL    LectMsg_MoveToPrevMsg(
  56.                             VOIE *    pVoie_curr );
  57.     static    void    LectMsg_DisplayRecChange(
  58.                             VOIE *    pVoie_curr );    /* In: Voie concern‚e */
  59.     static    COMPACT_RECORD * LectMsg_FindNextAllowed(                /* In: prochain message trouv‚: */
  60.                             VOIE                *    pVoie_curr,
  61.                             COMPACT_RECORD    *    pCompRec );    /* In: Start */
  62.     static    COMPACT_RECORD * LectMsg_FindPrevAllowed(                /* In: prochain message trouv‚: */
  63.                             VOIE                *    pVoie_curr,
  64.                             COMPACT_RECORD    *    pCompRec );    /* In: Start */
  65.  
  66. /*
  67.  * --------------------------- METHODES -------------------------------
  68.  */
  69.  
  70.  
  71. /*
  72.  * LectMsg_ENPG(-)
  73.  *
  74.  * Purpose:
  75.  * --------
  76.  * Traitrement des initialisations ENTER PAGE
  77.  *
  78.  * History:
  79.  * --------
  80.  * 18.12.94: fplanque: Created
  81.  * 10.01.95: s‚paration entre affichage des donnes fixe et du 1er msg
  82.  * 24.01.95: demande un DPAG
  83.  */
  84. void    LectMsg_ENPG(
  85.             VOIE    *    pVoie_curr )        /* In: Voie concern‚e */
  86. {
  87.     /*
  88.      * valeurs Par d‚faut:
  89.      * Num‚ro de record en haut de l'‚cran:
  90.      * Num‚ro de record courant:
  91.      */
  92.     pVoie_curr -> n_RecIndex_Curr = 1;
  93.     pVoie_curr -> n_RecIndex_Top = pVoie_curr -> n_RecIndex_Curr;
  94.  
  95.     /*
  96.      * Cherche et sauve le champ qui affichera le texte
  97.      * et qui pourra ˆtre scroll‚:
  98.      */
  99.     pVoie_curr -> pOutputFPar_CurrOut = Find_OutField( pVoie_curr, FO_TEXT );
  100.  
  101.     /*
  102.      * Ouvre base de donn‚es:
  103.      */
  104.     register_action( pVoie_curr, OPDB, FB_RUB, 0, NULL );
  105.     /*
  106.      * Affiche donn‚es 
  107.      */
  108.     register_action( pVoie_curr, DDAT, 0, 0, NULL );
  109.     register_action( pVoie_curr, DREC, 0, 0, NULL );
  110.     register_action( pVoie_curr, DPAG, 0, 0, NULL );
  111. }
  112.  
  113.  
  114. /*
  115.  * LectMsg_OPDB(-)
  116.  *
  117.  * Purpose:
  118.  * --------
  119.  * On vient d'ouvrir une base de donn‚es
  120.  * -> traitement sp‚cial?
  121.  *    ex: init ptr sur 1er record
  122.  *
  123.  * History:
  124.  * --------
  125.  * 12.01.94: fplanque: Created
  126.  * 30.01.95: r‚cupŠre record … afficher transmis en param si c'est le cas
  127.  */
  128. void    LectMsg_OPDB(
  129.             VOIE    *    pVoie_curr,        /* In: Voie concern‚e */
  130.             int        n_fnct_base )    /* In: Fonction de la base de don‚es qu'on vient d'ouvrir */
  131. {
  132.     if( n_fnct_base == FB_RUB )
  133.     {    /* 
  134.          * On vient d'ouvrir la rubrique:
  135.          * On va fixer un ptr sur le message en cours de lecture: 
  136.          */
  137.         DATAPAGE            *    dbase = pVoie_curr -> database;        /* Base de donn‚es concern‚e */
  138.         DATA_RECORDS    *    data_recs = dbase -> data.records;    /* Infos sur les enregistrements */
  139.         COMPACT_RECORD    *    pCompRec_Locked_IN = pVoie_curr -> pCompRec_Locked_IN;    /* Record re‡u en paramŠtre */
  140.         COMPACT_RECORD    *    compact_rec;
  141.         
  142.         /*
  143.          * cherche 1er Enregistrement … afficher 
  144.          */    
  145.         if( pCompRec_Locked_IN != NULL && dbase ==  pVoie_curr -> pDataPage_LockedDB_IN )
  146.         {    /*
  147.              * On a re‡u un record … lire en paramŠtre:
  148.              */
  149.             compact_rec = pCompRec_Locked_IN;
  150.         }
  151.         else
  152.         {    /*
  153.              * Pas de param indiquant premier record:
  154.              * On commence sur le premier:
  155.              */
  156.             compact_rec =  data_recs -> first_record;
  157.         }
  158.         
  159.         /*
  160.          * Se place sur le prochain record qu'on a le droit de lire
  161.          * Contr“le PRIVATE!
  162.          */
  163.         compact_rec = LectMsg_FindNextAllowed( pVoie_curr, compact_rec );    
  164.  
  165.         /*
  166.          * v‚rifie qu'il y a un message qu'on est autoris‚ … lire:
  167.          */
  168.         if( compact_rec == NULL )
  169.         {
  170.             return;
  171.         }
  172.  
  173.         /*
  174.          * Si pas encore fait,
  175.          * Demande un lock de lecture sur l'enregistrement:
  176.          */
  177.         if( compact_rec != pCompRec_Locked_IN )
  178.         {    /*
  179.              * Si le message … lire n'est pas celui qu'on a re‡u en parametre
  180.              * (car le param est d‚j… lock‚)
  181.              * on locke ce record:
  182.              */
  183.             compact_rec = DBInt_requestReadLock( pVoie_curr, compact_rec );
  184.         }
  185.  
  186.         /*
  187.          * Sauve ptr sur message … lire: 
  188.          */
  189.         pVoie_curr -> curr_comprec = compact_rec;
  190.          
  191.     }
  192. }
  193.  
  194.  
  195. /*
  196.  * LectMsg_DispData(-)
  197.  *
  198.  * Purpose:
  199.  * --------
  200.  * Affiche les donn‚es initiales … l'‚cran:
  201.  *
  202.  * Notes:
  203.  * ------
  204.  * Ceci n'est normalement ‚x‚cut‚ qu'une seule fois … l'entr‚e de la page
  205.  *
  206.  * History:
  207.  * --------
  208.  * 10.01.95: fplanque: Created
  209.  * 24.01.95: appel de OutFields_DisplayGroup()
  210.  */
  211. void    LectMsg_DispData(
  212.             VOIE *    pVoie_curr )    /* In: Voie concern‚e */
  213. {
  214.     /*
  215.      * Affichage champs groupe 1 (commentaire...):
  216.      */
  217.     OutFields_DisplayGroup( pVoie_curr, 1, 0, 0 );
  218. }
  219.  
  220.  
  221. /*
  222.  * LectMsg_DispMsg(-)
  223.  *
  224.  * Purpose:
  225.  * --------
  226.  * Affiche un message de rubrique sur l'‚cran du connect‚
  227.  *
  228.  * Notes:
  229.  * ------
  230.  * C'est la 1Šre page en tout cas qui est affich‚e
  231.  *
  232.  * History:
  233.  * --------
  234.  * 1993: fplanque: Created
  235.  * 19.11.94: fplanque: affichage de nouveaux champs
  236.  * 19.12.94: conserve le champ MTXT; appel de nlles sous routines
  237.  * 08.01.95: Public/priv‚
  238.  * 10.01.95: set_DisplayFields() est sorti ds dispData: il n'y sera execut‚ qu'une seule fois! mieux!
  239.  * 24.01.95: appel de OutFields_DisplayGroup(); n'affiche pas le groupe 4, un msg DPAG est envoy‚ pour ‡a
  240.  */
  241. void    LectMsg_DispMsg( 
  242.             VOIE *    pVoie_curr )    /* In: Voie concern‚e */
  243. {
  244.     COMPACT_FIELD    *     pCompField;
  245.  
  246.     /*
  247.      * Affichage des champs du groupe 2:
  248.      * (date, pub/priv, DSTA; MTIT)
  249.      */
  250.     OutFields_DisplayGroup( pVoie_curr, 2, 0, 0 );
  251.  
  252.     /*
  253.      * Pr‚paration du texte du message courant
  254.      * qui sera affich‚ dans le groupe 4
  255.      * et qui pourra ˆtre scroll‚ par la suite:
  256.      */
  257.     if( pVoie_curr -> pOutputFPar_CurrOut != NULL )
  258.     {    /*
  259.          * S'il y a un champ d'affichage du texte (scrollable):
  260.          */
  261.         pCompField = Find_FieldinCompactRecord( pVoie_curr -> curr_comprec,     pVoie_curr -> pOutputFPar_CurrOut -> ul_CodeChamp );
  262.         if( pCompField != NULL )
  263.         {    /*
  264.               * Si on a trouv‚ le Champ … afficher dans le record:
  265.               */
  266.             pVoie_curr -> pIOField_CurrOut = IOField_PrepareText( pVoie_curr -> pOutputFPar_CurrOut, (char *) (pCompField -> bytes), pCompField -> size_FieldLen );
  267.         }
  268.     }
  269.  
  270. }
  271.  
  272.  
  273.  
  274. /*
  275.  * LectMsg_CanRead(-)
  276.  *
  277.  * Purpose:
  278.  * --------
  279.  * Check to see if user is allowed to read concerned message
  280.  *
  281.  * History:
  282.  * --------
  283.  * 12.01.95: fplanque: Created
  284.  */
  285. BOOL    LectMsg_CanRead(                        /* Out: TRUE_1 if allowed */
  286.             VOIE                *    pVoie_curr,    /* In:  Voie concern‚e */
  287.             COMPACT_RECORD    *    pCompRec    )    /* In:  Message concern‚ */        
  288. {
  289.     RECORD_FLAGS        RecFlags = CompRec_GetRecFlags( pCompRec );
  290.     COMPACT_FIELD *     pCompField;
  291.  
  292.     if( ! RecFlags .b_Private )
  293.     {    /*
  294.          * Il s'agit d'un message public
  295.          * on peut y aller
  296.          */
  297.         return    TRUE_1;
  298.     }
  299.  
  300.     /*
  301.      * Il s'agit d'un message priv‚:
  302.      */
  303.     if( pVoie_curr -> pMsz_Login == NULL )
  304.     {    /*
  305.          * Si le connect‚ n'est pas identifi‚:
  306.          */
  307.         return    FALSE0;
  308.     }
  309.          
  310.     pCompField = Find_FieldinCompactRecord( pCompRec, 'DSTA' );
  311.     if( pCompField == NULL || pCompField -> size_FieldLen == 0 )
  312.     {    /*
  313.          * Si le destinatire n'est pas indiqu‚ dans le message:
  314.          */
  315.         return    FALSE0;
  316.     }
  317.  
  318.     if( Sstrcmp( (char *) (pCompField -> bytes), pVoie_curr -> pMsz_Login, '@' ) == 0 )
  319.     {    /*
  320.          * Si les noms sont identiques:
  321.          */
  322.         return    TRUE_1;                
  323.     }
  324.     
  325.     return FALSE;
  326. }
  327.  
  328. /*
  329.  * LectMsg_FindNextAllowed(-)
  330.  *
  331.  * Purpose:
  332.  * --------
  333.  * Cherche prochain message que le connect‚ est autoris‚ … consulter
  334.  *
  335.  * History:
  336.  * --------
  337.  * 12.01.95: fplanque: Created
  338.  */
  339. COMPACT_RECORD * LectMsg_FindNextAllowed(                /* In: prochain message trouv‚: */
  340.                         VOIE                *    pVoie_curr,
  341.                         COMPACT_RECORD    *    pCompRec )    /* In: Start */
  342. {
  343.     while( pCompRec != NULL )
  344.     {
  345.         if( LectMsg_CanRead( pVoie_curr, pCompRec ) )
  346.         {
  347.             return    pCompRec;
  348.         }
  349.         
  350.         /* 
  351.          * Passe au message suivant:
  352.          */
  353.         pCompRec = pCompRec -> next;
  354.     }
  355.  
  356.     return    NULL;
  357. }
  358.  
  359.  
  360. /*
  361.  * LectMsg_FindPrevAllowed(-)
  362.  *
  363.  * Purpose:
  364.  * --------
  365.  * Cherche pr‚c‚dent message que le connect‚ est autoris‚ … consulter
  366.  *
  367.  * History:
  368.  * --------
  369.  * 12.01.95: fplanque: Created
  370.  */
  371. COMPACT_RECORD * LectMsg_FindPrevAllowed(                /* In: prochain message trouv‚: */
  372.                         VOIE                *    pVoie_curr,
  373.                         COMPACT_RECORD    *    pCompRec )    /* In: Start */
  374. {
  375.     while( pCompRec != NULL )
  376.     {
  377.         if( LectMsg_CanRead( pVoie_curr, pCompRec ) )
  378.         {
  379.             return    pCompRec;
  380.         }
  381.         
  382.         /* 
  383.          * Passe au message suivant:
  384.          */
  385.         pCompRec = pCompRec -> prev;
  386.     }
  387.  
  388.     return    NULL;
  389. }
  390.  
  391.  
  392. /*
  393.  * LectMsg_MoveToNextMsg(-)
  394.  *
  395.  * Purpose:
  396.  * --------
  397.  * Se d‚place sur le message suivant de la rubrique
  398.  * (appui sur [*] SUITE)
  399.  *
  400.  * History:
  401.  * --------
  402.  * 19.12.94: fplanque: Created
  403.  * 12.01.95: fplanque: contr“le des msgs priv‚s
  404.  * 30.01.95: incr‚mente no de record
  405.  */
  406. BOOL    LectMsg_MoveToNextMsg(
  407.             VOIE *    pVoie_curr )
  408. {
  409.     COMPACT_RECORD    *    curr_comprec = pVoie_curr -> curr_comprec;
  410.  
  411.     /*
  412.      * Cherche le prochain message qui s'adresse au connect‚:
  413.      */
  414.     COMPACT_RECORD *    pCompRec_target = LectMsg_FindNextAllowed( pVoie_curr, curr_comprec -> next );
  415.  
  416.     if( pCompRec_target == NULL )
  417.     {
  418.         aff_msg_l0( pVoie_curr, "Pas de message suivant!" );
  419.         return    FALSE0;
  420.     }
  421.  
  422.     /* 
  423.      * Si on peut avancer: 
  424.      */
  425.     DBInt_releaseReadLock( pVoie_curr, curr_comprec );    /* On sort de l'enregistrement courant */
  426.  
  427.     /*
  428.      * Demande un lock de lecture sur l'enregistrement suivant:
  429.      * Sauve ptr sur message … lire: 
  430.      */
  431.     pVoie_curr -> curr_comprec  = DBInt_requestReadLock( pVoie_curr, pCompRec_target );
  432.  
  433.     /*
  434.      * Incr‚mente num‚ro de record:
  435.      */
  436.     (pVoie_curr -> n_RecIndex_Curr) ++;
  437.     pVoie_curr -> n_RecIndex_Top = pVoie_curr -> n_RecIndex_Curr;
  438.  
  439.     /*
  440.      * Affiche nouveau msg … l'‚cran:
  441.      */
  442.     LectMsg_DisplayRecChange( pVoie_curr );
  443.     return    TRUE_1;        /* On a chang‚ de record */
  444.  
  445. }
  446.  
  447.  
  448. /*
  449.  * LectMsg_MoveToPrevMsg(-)
  450.  *
  451.  * Purpose:
  452.  * --------
  453.  * Se d‚place sur le message pr‚c‚dent de la rubrique
  454.  * (appui sur [*] RETOUR)
  455.  *
  456.  * History:
  457.  * --------
  458.  * 12.01.95: fplanque: contr“le des msgs priv‚s
  459.  * 19.12.94: fplanque: Created
  460.  * 30.01.95: d‚cr‚mente no de record
  461.  */
  462. BOOL    LectMsg_MoveToPrevMsg(
  463.             VOIE *    pVoie_curr )
  464. {
  465.     COMPACT_RECORD    *    curr_comprec = pVoie_curr -> curr_comprec;
  466.  
  467.     /*
  468.      * Cherche le prochain message qui s'adresse au connect‚:
  469.      */
  470.     COMPACT_RECORD *    pCompRec_target = LectMsg_FindPrevAllowed( pVoie_curr, curr_comprec -> prev );
  471.  
  472.     if( pCompRec_target == NULL )
  473.     {
  474.         aff_msg_l0( pVoie_curr, "Pas de message pr‚c‚dent!" );
  475.         return    FALSE0;
  476.     }
  477.  
  478.     /* 
  479.      * Si on peut reculer: 
  480.      */
  481.     DBInt_releaseReadLock( pVoie_curr, curr_comprec );    /* On sort de l'enregistrement courant */
  482.  
  483.     /*
  484.      * Demande un lock de lecture sur l'enregistrement suivant:
  485.      * Sauve ptr sur message … lire: 
  486.      */
  487.     pVoie_curr -> curr_comprec  = DBInt_requestReadLock( pVoie_curr, pCompRec_target );
  488.  
  489.     /*
  490.      * D‚cr‚mente num‚ro de record:
  491.      */
  492.     if( pVoie_curr -> n_RecIndex_Curr > 1 )
  493.     {
  494.         (pVoie_curr -> n_RecIndex_Curr) --;
  495.         pVoie_curr -> n_RecIndex_Top = pVoie_curr -> n_RecIndex_Curr;
  496.     }
  497.  
  498.     /*
  499.      * Affiche nouveau msg … l'‚cran:
  500.      */
  501.     LectMsg_DisplayRecChange( pVoie_curr );
  502.  
  503.     return    TRUE_1;        /* On a chang‚ de record */
  504. }
  505.  
  506.  
  507.  
  508.  
  509. /*
  510.  * LectMsg_EraseCurrRec(-)
  511.  *
  512.  * Purpose:
  513.  * --------
  514.  * Contr“le si on peu effacer puis
  515.  * Efface le record courament affich‚ … l'‚cran
  516.  * et met … jour l'affichage
  517.  *
  518.  * History:
  519.  * --------
  520.  * 11.05.94: fplanque: Created
  521.  * 17.05.94: fplanque: demande ReadLock lors du passage au msg suivant
  522.  * 17.05.94: Demande Xlock avant d'effacer, si non accord‚, n'efface pas.
  523.  * 24.09.94: correction bug lorsqu'on effa‡ait le dernier msg d'une rub
  524.  * 12.01.95: appel de LectMsg_DisplayRecChange()
  525.  * 13.01.95: met statut maj de la DB … MODIFIED
  526.  * 15.03.95: appel de CompRec_Erase(); renvoie success/failure
  527.  */
  528. BOOL    LectMsg_EraseCurrRec(         /* Out: TRUE if success */
  529.             VOIE *    pVoie_curr )    /* In: Voie qui demande l'effacement */
  530. {
  531.     DATAPAGE            *    pDataPage_DB = pVoie_curr -> database;
  532.     COMPACT_RECORD *    pCompRec_toKill = pVoie_curr -> curr_comprec;    /* Msg courament affich‚ */
  533.     COMPACT_RECORD *    pCompRec_afterKill;    /* Message … afficher aprŠs avoir d‚truit le courant */
  534.  
  535.     if( pCompRec_toKill == NULL )
  536.     {
  537.         aff_msg_l0( pVoie_curr, "Pas de message … effacer!" );
  538.         return    FALSE0;
  539.     }
  540.  
  541.     add_textinf( pVoie_curr -> wi_params, "    Effacement du record courant" );
  542.  
  543.  
  544.     /* 
  545.       * S'il y a un message a effacer...
  546.      *
  547.      * Un peu paradoxalement, on commence par chercher le message
  548.      * sur lequel on ira aprŠs!
  549.      * Cherche le prochain msg qui s'adresse … nous:
  550.      */
  551.     pCompRec_afterKill = LectMsg_FindNextAllowed( pVoie_curr, pCompRec_toKill -> next );
  552.     if( pCompRec_afterKill == NULL )
  553.     {    /*
  554.          * Si pas trouv‚ vers l'avant:
  555.          * Cherche vers l'arriŠre:
  556.          */
  557.         pCompRec_afterKill = LectMsg_FindPrevAllowed( pVoie_curr, pCompRec_toKill -> prev );
  558.     }
  559.  
  560.     /*
  561.      * Demande l'effacement:
  562.      */
  563.     if( CompRec_Erase( pVoie_curr, pCompRec_toKill, pDataPage_DB ) == FALSE0 )
  564.     {
  565.         return    FALSE0;
  566.     } 
  567.  
  568.     /*
  569.      * On va maintenant afficher un autre message:
  570.      */
  571.     pVoie_curr -> curr_comprec = pCompRec_afterKill;    
  572.  
  573.     if( pCompRec_afterKill != NULL )
  574.     {    /*
  575.          * Si on doit afficher un nouveau msg, cad S'il reste des messages
  576.          * Demande un lock de lecture sur le nouveau message:
  577.          */
  578.         DBInt_requestReadLock( pVoie_curr, pCompRec_afterKill );
  579.     }
  580.     
  581.     /*
  582.      * Mise … jour de l'affichage:
  583.      */
  584.     LectMsg_DisplayRecChange( pVoie_curr );
  585.      
  586.     return    TRUE_1;
  587. }
  588.  
  589.  
  590.  
  591. /*
  592.  * LectMsg_DisplayRecChange(-)
  593.  *
  594.  * Purpose:
  595.  * --------
  596.  * Affiche les informations du nouveau message (+1ere page)
  597.  * auquel on vient de se rendre
  598.  *
  599.  * History:
  600.  * --------
  601.  * 19.12.94: fplanque: Created
  602.  * 13.01.95: effacement des champs qui vont ˆtre renouvel‚s
  603.  * 24.01.95: n'efface plus les champ: c'est automatik avant l"affichage maintenant
  604.  * 25.01.95: demande DPAG
  605.  * 28.03.95: n'efface plus le curseur
  606.  */
  607. void    LectMsg_DisplayRecChange(
  608.             VOIE *    pVoie_curr )    /* In: Voie concern‚e */
  609. {
  610.     register_action( pVoie_curr, DISP, FE_CHGREC, 0, NULL );        /* Demande affichage page ‚cran */
  611.     register_action( pVoie_curr, DREC, 0, 0, NULL );        /* Affiche en tete message */
  612.     register_action( pVoie_curr, DPAG, 0, 0, NULL );        /* Affiche 1ere page message */
  613.     register_action( pVoie_curr, CPOS, 0, 0, NULL );        /* Repositionne curseur pour continuer ‚dition */
  614.     register_action( pVoie_curr, WAIT, 0, 0, NULL );        /* Repasse en mode d'attente d'action */
  615. }
  616.  
  617.  
  618. /*
  619.  * LectMsg_KeyAction(-)
  620.  *
  621.  * Purpose:
  622.  * --------
  623.  * R‚agit … la touche press‚e sur une page de LECTURE
  624.  *
  625.  * Suggest: 
  626.  * --------
  627.  * Provisoire:
  628.  * Pas de v‚rification si le readlock du nouveau message est accept‚
  629.  *
  630.  * History:
  631.  * --------
  632.  * 1993: fplanque: Created
  633.  * 10.05.94: fplanque: Ajout gestion [ANNULATION]->EFFACEMENT MESSAGE
  634.  * 11.05.94: fplanque: Ajout de messages ligne0
  635.  * 17.05.94: fplanque: Lib‚ration et demande de ReadLocks lors du chgt de msg
  636.  * 24.09.94: correction bug autorisation touche annul
  637.  * 24.09.94: possibilit‚ de taper des mots clef
  638.  * 19.12.94: fplanque: enhanced!?
  639.  * 06.01.94: corrig‚ bugs ds d‚pacement de pages
  640.  * 12.04.95: Annulation trait‚ normalement, l'effacement est maintenant trait‚ comme une commande ‚ventuellement associ‚ … la touche ANNUL
  641.  */
  642. void    LectMsg_KeyAction( 
  643.             KEYCODE    curr_keypress, /* In: Touche press‚e */
  644.             VOIE    *    pVoie_curr )    /* In: Voie concern‚e */
  645. {
  646.     switch( curr_keypress )
  647.     {
  648.         case    KEY_RETOUR:
  649.         case    KEY_SUITE:
  650.         {    /*
  651.              * Ptr sur enregistrement courant: 
  652.              */
  653.             COMPACT_RECORD    *    curr_comprec = pVoie_curr -> curr_comprec;
  654.             IOFIELD            *    pIOField_CurrOut = pVoie_curr -> pIOField_CurrOut;
  655.             int                    nb_VisibleLines;
  656.         
  657.             /* 
  658.              * Teste s'il y a des messages: 
  659.              */
  660.             if( curr_comprec == NULL || pIOField_CurrOut == NULL )
  661.             {
  662.                 aff_msg_l0( pVoie_curr, "Pas de message!" );
  663.                 break;
  664.             }
  665.  
  666.             /*
  667.               * S'il y a au moins 1 message: 
  668.               */
  669.             affiche_touche( pVoie_curr, curr_keypress );        /* Affiche nom de la touche */
  670.              
  671.              /*
  672.               * Nbre de lignes affich‚es:
  673.               */
  674.              nb_VisibleLines = pIOField_CurrOut -> FPar.Input -> h;
  675.               
  676.             if ( curr_keypress == KEY_RETOUR )
  677.             {    /*
  678.                  * Tentative de recul: 
  679.                  */
  680.                 if( IOField_MoveTopLine( pIOField_CurrOut, -nb_VisibleLines ) < 0 )
  681.                 {    /*
  682.                      * On est pas sur la premiŠre page du message:
  683.                      */
  684.                     Generic_DisplayPageChange( pVoie_curr );
  685.                     break;
  686.                 }
  687.  
  688.                 LectMsg_MoveToPrevMsg( pVoie_curr );
  689.             }
  690.             else
  691.             {    /*
  692.                  * Tentative d'avancement: 
  693.                  */
  694.                 TEXTLINE    *    pTextLine_CurrTop = pIOField_CurrOut -> pTextLine_Top;
  695.  
  696.                 if( IOField_MoveTopLine( pIOField_CurrOut, nb_VisibleLines ) == nb_VisibleLines )
  697.                 {    /*
  698.                      * On est pas sur la derniŠre page du message:
  699.                      */
  700.                     Generic_DisplayPageChange( pVoie_curr );
  701.                     break;
  702.                 }
  703.  
  704.                 /*
  705.                  * On ne se d‚place pas dans le message:
  706.                  */
  707.                 pIOField_CurrOut -> pTextLine_Top = pTextLine_CurrTop;
  708.     
  709.                 LectMsg_MoveToNextMsg( pVoie_curr );
  710.             }
  711.         
  712.         }    
  713.             break;
  714.             
  715.         case    KEY_ENVOI:                
  716.             if( ! serv_handleKeyword( pVoie_curr, '\0' ) )
  717.             {    /*
  718.                  * Si pas de mot clef:
  719.                  */
  720.                 affiche_touche( pVoie_curr, curr_keypress );        /* Affiche nom de la touche */
  721.  
  722.                 /*
  723.                  * Demande Changement de page:
  724.                  */
  725.                 follow_KeyArboLink( pVoie_curr, curr_keypress );
  726.             }
  727.             break;
  728.  
  729.  
  730.         case    KEY_REPET:
  731.         case    KEY_GUIDE:
  732.         case    KEY_SOMM:
  733.         case    KEY_ANNUL:
  734.         case    KEY_CORREC:
  735.             affiche_touche( pVoie_curr, curr_keypress );        /* Affiche nom de la touche */
  736.             /*
  737.              * Demande Changement de page:
  738.              */
  739.             follow_KeyArboLink( pVoie_curr, curr_keypress );
  740.             break;
  741.  
  742.         default:
  743.             signale("Code touche inconnu");
  744.     }
  745.  
  746. }
  747.  
  748.